{# Template for C++ class header file #}
{% if file_header %}
{{ file_header }}

{% endif %}
{%- if use_pragma_once %}
#pragma once
{% else %}
#ifndef {{ header_guard }}
#define {{ header_guard }}
{% endif %}

{%- if includes %}
{{ includes }}

{% endif %}
{%- if forward_declarations %}
// Forward declarations
{{ forward_declarations }}

{% endif %}
{%- if namespace_parts %}
namespace {{ namespace_parts | join('::') }} {

{% endif %}
{%- if class_comment %}
{{ class_comment }}
{% endif %}
{%- if class_template_decl %}
{{ class_template_decl }}
{% endif %}
class {{ class_name }}{% if base_classes %} : {{ base_classes | join(', ') }}{% endif %} {
{% if public_methods or public_fields or constructors or destructor %}
public:
{%- if constructors %}
{% for ctor in constructors %}
{% if ctor.comment %}
    {{ ctor.comment }}
{% endif %}
    {{ ctor.signature }};
{% if not loop.last %}

{% endif %}
{% endfor %}
{% endif %}
{%- if destructor %}

{% if destructor.comment %}
    {{ destructor.comment }}
{% endif %}
    {{ destructor.signature }};
{% endif %}
{%- if public_methods %}

{% for method in public_methods %}
{% if method.comment %}
    {{ method.comment }}
{% endif %}
{% if method.template_decl %}
    {{ method.template_decl }}
{% endif %}
    {{ method.signature }};
{% if not loop.last %}

{% endif %}
{% endfor %}
{% endif %}
{%- if public_fields %}

{% for field in public_fields %}
{% if field.comment %}
    {{ field.comment }}
{% endif %}
    {{ field.declaration }};
{% endfor %}
{% endif %}
{%- endif %}
{% if protected_methods or protected_fields %}

protected:
{%- if protected_methods %}
{% for method in protected_methods %}
{% if method.comment %}
    {{ method.comment }}
{% endif %}
{% if method.template_decl %}
    {{ method.template_decl }}
{% endif %}
    {{ method.signature }};
{% if not loop.last %}

{% endif %}
{% endfor %}
{% endif %}
{%- if protected_fields %}

{% for field in protected_fields %}
{% if field.comment %}
    {{ field.comment }}
{% endif %}
    {{ field.declaration }};
{% endfor %}
{% endif %}
{%- endif %}
{% if private_methods or private_fields %}

private:
{%- if private_methods %}
{% for method in private_methods %}
{% if method.comment %}
    {{ method.comment }}
{% endif %}
{% if method.template_decl %}
    {{ method.template_decl }}
{% endif %}
    {{ method.signature }};
{% if not loop.last %}

{% endif %}
{% endfor %}
{% endif %}
{%- if private_fields %}

{% for field in private_fields %}
{% if field.comment %}
    {{ field.comment }}
{% endif %}
    {{ field.declaration }};
{% endfor %}
{% endif %}
{%- endif %}
};
{%- if namespace_parts %}

}  // namespace {{ namespace_parts | join('::') }}
{%- endif %}
{% if not use_pragma_once %}

#endif  // {{ header_guard }}
{%- endif %}
